package com.wen.imagezip.util;


import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Iterator;


public class ImageCompressionUtil {

    /**
     * 压缩图片
     *
     * @param image 原始图片
     * @param compressionQuality 压缩质量（0-1，1为最高质量，无压缩）
     * @return 压缩后的图片字节数组
     * @throws IOException
     */
    public static byte[] compressImage(BufferedImage image, float compressionQuality) throws IOException {
        // 获取图片写入器
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("JPEG");
        ImageWriter writer = writers.next();

        // 设置压缩参数
        ImageWriteParam writeParam = writer.getDefaultWriteParam();
        if (writeParam.canWriteCompressed()) {
            writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            writeParam.setCompressionQuality(compressionQuality);
        }

        // 创建输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
        writer.setOutput(ios);

        // 写入图片
        writer.write(null, new javax.imageio.IIOImage(image, null, null), writeParam);

        // 关闭资源
        writer.dispose();
        ios.close();
        baos.close();

        return baos.toByteArray();
    }

    /**
     * 动态计算压缩质量
     *
     * @param image 原始图片
     * @return 动态计算的压缩质量
     */
    public static float dynamicCalculateCompressionQuality(BufferedImage image) {
        // 这里可以结合图片的分辨率、颜色复杂度等因素来动态调整压缩质量
        // 以下是一个简单的示例，根据图片的宽度和高度动态调整压缩质量
        int width = image.getWidth();
        int height = image.getHeight();

        float compressionQuality = 0.8f; // 默认压缩质量

        if (width > 2000 || height > 2000) {
            compressionQuality = 0.6f; // 大分辨率图片降低压缩质量
        } else if (width > 1000 || height > 1000) {
            compressionQuality = 0.7f;
        }

        return compressionQuality;
    }
}
